import json
import re
from typing import Dict, Any, Optional


class ResponseParser:
    """解析Ollama API响应的工具类"""
    
    def __init__(self):
        self.json_pattern = re.compile(r'\{.*?}')
        
    def parse(self, response_text: str) -> Dict[str, Any]:
        """
        解析API响应文本为字典
        
        Args:
            response_text (str): API返回的响应文本
            
        Returns:
            Dict[str, Any]: 包含字段名和对应类型的字典
        """
        # 清理文本
        cleaned_text = self._clean_text(response_text)
        
        # 尝试直接解析JSON
        result = self._try_parse_json(cleaned_text)
        if result is not None:
            return result
            
        # 如果直接解析失败，尝试提取JSON格式的内容
        json_content = self._extract_json(cleaned_text)
        if json_content:
            return self._try_parse_json(json_content)
            
        # 如果所有方法都失败，返回错误信息
        return {"error": "Could not parse response as JSON"}
        
    def _clean_text(self, text: str) -> str:
        """清理响应文本，移除多余字符"""
        return text.strip().replace('\n', '').replace('\\', '')
        
    def _try_parse_json(self, text: str) -> Optional[Dict[str, Any]]:
        """尝试将文本解析为JSON"""
        try:
            if text.startswith("Error:"):
                return {"error": text}
            return json.loads(text)
        except json.JSONDecodeError:
            return None
            
    def _extract_json(self, text: str) -> Optional[str]:
        """从文本中提取JSON格式的内容"""
        # 查找第一个和最后一个大括号
        match = self.json_pattern.search(text)
        if match:
            return match.group(0)
        return None

    def extract_json_objects(self,text: str):
        """
        从字符串中提取所有有效的JSON对象或数组。
        返回一个列表，包含所有找到的JSON数据（按出现的顺序）。
        """
        objects = []
        i = 0
        n = len(text)

        while i < n:
            if text[i] in ('{', '['):
                # 发现可能的JSON起始
                for j in range(n, i, -1):  # 从最长子串开始尝试
                    substr = text[i:j]
                    try:
                        obj = json.loads(substr)
                        objects.append(obj)
                        i = j  # 跳过已处理的部分
                        break
                    except json.JSONDecodeError:
                        continue
            i += 1  # 移动到下一个字符
        if len(objects) > 0:
            return objects[0]
        else:
            return {}
# 创建单例实例
response_parser = ResponseParser()
